package org.dromara.demo.controller;

import org.dromara.common.core.domain.R;
import org.dromara.demo.domain.TestDemoEncrypt;
import org.dromara.demo.mapper.TestDemoEncryptMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;


/**
 * @Author 刘武贵
 * @Date 2024/8/15 22:00
 * @Description 功能描述：测试数据库加解密功能
 */
@Validated
@RestController
@RequestMapping("/demo/encrypt")
public class TestEncryptController {

    /**
     * 测试加密功能
     */
    @Autowired
    private TestDemoEncryptMapper mapper;

    /**
     * 启用加密功能的配置，用于控制是否对数据进行加密处理
     */
    @Value("${mybatis-encryptor.enable}")
    private Boolean encryptEnable;

    /**
     * 测试数据库加解密
     * 此方法用于演示如何加密和解密数据使用
     * 它首先检查加密功能是否开启，如果未开启，则抛出运行时异常
     * 然后，它创建一个 TestDemoEncrypt 对象，设置传入的 key 和 value，然后将该对象插入数据库
     * 接着，从数据库中根据插入的对象 ID 查询该对象，进行解密
     * 最后，将加密和解密的结果放入一个 Map 中，并返回包含这个 Map 的成功响应对象
     *
     * @param key   测试key
     * @param value 测试value
     * @return 包含加密和解密结果的响应对象
     */
    @GetMapping()
    public R<Map<String, TestDemoEncrypt>> test(String key, String value) {
        // 检查加密功能是否开启，未开启则抛出异常
        if (!encryptEnable) {
            throw new RuntimeException("加密功能未开启!");
        }
        // 初始化用于存储加密和解密结果的 Map
        Map<String, TestDemoEncrypt> map = new HashMap<>(2);
        // 创建并设置要加密的对象
        TestDemoEncrypt demo = new TestDemoEncrypt();
        demo.setTestKey(key);
        demo.setValue(value);
        // 插入加密后的对象到数据库
        mapper.insert(demo);
        // 将加密结果放入 Map
        map.put("加密", demo);
        // 从数据库中查询加密对象，进行解密
        TestDemoEncrypt testDemo = mapper.selectById(demo.getId());
        // 将解密结果放入 Map
        map.put("解密", testDemo);
        // 返回包含加密和解密结果的响应对象
        return R.ok(map);
    }


}
